<!doctype html>
<html lang="en" class="page-type-section">
<head prefix="og: http://ogp.me/ns#">
<meta charset="utf-8">
<title>数据模型一览 - FreeMarker 手册</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="format-detection" content="telephone=no">
<meta property="og:site_name" content="FreeMarker 手册">
<meta property="og:title" content="数据模型一览">
<meta property="og:locale" content="en_US">
<meta property="og:url" content="http://freemarker.org/docs/dgui_quickstart_datamodel.html">
<link rel="canoical" href="http://freemarker.org/docs/dgui_quickstart_datamodel.html">
<link rel="icon" href="favicon.png" type="image/png">
<link rel="stylesheet" type="text/css" href="docgen-resources/docgen.min.css">
</head>
<body itemscope itemtype="https://schema.org/Code">
    <meta itemprop="url" content="http://freemarker.org/docs/">
    <meta itemprop="name" content="FreeMarker 手册">

  <!--[if lte IE 9]>
  <div style="background-color: #C00; color: #fff; padding: 12px 24px;">Please use a modern browser to view this website.</div>
  <![endif]--><div class="header-top-bg"><div class="site-width header-top"><a class="logo" href="http://freemarker.org" role="banner">            <img itemprop="image" src="logo.png" alt="FreeMarker">
</a><ul class="tabs"><li><a href="http://freemarker.org/">Home</a></li><li class="current"><a href="index.html">Manual</a></li><li><a class="external" href="http://freemarker.org/docs/api/index.html">Java API</a></li></ul><ul class="secondary-tabs"><li><a class="tab icon-heart" href="http://freemarker.org/contribute.html" title="Contribute"><span>Contribute</span></a></li><li><a class="tab icon-bug" href="https://sourceforge.net/p/freemarker/bugs/new/" title="Report a Bug"><span>Report a Bug</span></a></li><li><a class="tab icon-download" href="http://freemarker.org/freemarkerdownload.html" title="Download"><span>Download</span></a></li></ul></div></div><div class="header-bottom-bg"><div class="site-width search-row"><a href="toc.html" class="navigation-header">Manual</a><div class="navigation-header"></div></div><div class="site-width breadcrumb-row"><ul class="breadcrumb" itemscope itemtype="http://schema.org/BreadcrumbList"><li class="step-0" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="toc.html"><span itemprop="name">FreeMarker 手册</span></a></li><li class="step-1" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="dgui.html"><span itemprop="name">模板开发指南</span></a></li><li class="step-2" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="dgui_quickstart.html"><span itemprop="name">入门</span></a></li><li class="step-3" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="dgui_quickstart_datamodel.html"><span itemprop="name">数据模型一览</span></a></li></ul><div class="bookmarks" title="Bookmarks"><span class="sr-only">Bookmarks:</span><ul class="bookmark-list"><li><a href="alphaidx.html">Alpha. index</a></li><li><a href="gloss.html">Glossary</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions</a></li><li><a href="ref_builtins_alphaidx.html">?builtins</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_specvar.html">.spec_vars</a></li><li><a href="app_faq.html">FAQ</a></li></ul></div></div></div>    <div class="main-content site-width">
      <div class="content-wrapper">
  <div id="table-of-contents-wrapper" class="col-left">
      <script>var breadcrumb = ["FreeMarker 手册","模板开发指南","入门","数据模型一览"];</script>
      <script src="toc.js"></script>
      <script src="docgen-resources/main.min.js"></script>
  </div>
<div class="col-right"><div class="page-content"><div class="page-title"><div class="pagers top"><a class="paging-arrow previous" href="dgui_quickstart_basics.html"><span>Previous</span></a><a class="paging-arrow next" href="dgui_quickstart_template.html"><span>Next</span></a></div><div class="title-wrapper">
<h1 class="content-header header-section1" id="dgui_quickstart_datamodel" itemprop="headline">数据模型一览</h1>
</div></div><p>正如已经看到的，数据模型的基本结构是树状的。
		这棵树可以很复杂，并且可以有很大的深度，比如：</p>

<div class="code-wrapper"><pre class="code-block code-data-model"><a name="example.qStart.dataModelWithHashes"></a>(root)
  |
  +- animals
  |   |
  |   +- mouse
  |   |   |   
  |   |   +- size = &quot;small&quot;
  |   |   |   
  |   |   +- price = 50
  |   |
  |   +- elephant
  |   |   |   
  |   |   +- size = &quot;large&quot;
  |   |   |   
  |   |   +- price = 5000
  |   |
  |   +- python
  |       |   
  |       +- size = &quot;medium&quot;
  |       |   
  |       +- price = 4999
  |
  +- message = &quot;It is a test&quot;
  |
  +- misc
      |
      +- foo = &quot;Something&quot;</pre></div><p>上图中的变量扮演目录的角色(比如 root,
        <code class="inline-code">animals</code>, <code class="inline-code">mouse</code>,
        <code class="inline-code">elephant</code>, <code class="inline-code">python</code>,
        <code class="inline-code">misc</code>) 被称为 <strong>hashes</strong> (哈希表或哈希，译者注)。哈希表存储其他变量(被称为 
        <a name="topic.dataModel.subVar"></a><em>子变量</em>)，
		它们可以通过名称来查找(比如 "animals",
        "mouse" 或 "price")。</p><p>存储单值的变量
        (<code class="inline-code">size</code>, <code class="inline-code">price</code>,
        <code class="inline-code">message</code> 和 <code class="inline-code">foo</code>) 称为
        <strong>scalars</strong> (标量，译者注)。</p><p><a name="topic.qStart.accessVariables"></a>如果要在模板中使用子变量，
		那应该从根root开始指定它的路径，每级之间用点来分隔开。要访问 <code class="inline-code">mouse</code> 的
        <code class="inline-code">price</code> ，要从root开始，首先进入到 <code class="inline-code">animals</code> ，之后访问
        <code class="inline-code">mouse</code> ，最后访问 <code class="inline-code">price</code> 。就可以这样来写 
		<code class="inline-code">animals.mouse.price</code>。</p><p>另外一种很重要的变量是 <strong>sequences</strong> (序列，译者注)。
		它们像哈希表那样存储子变量，但是子变量没有名字，它们只是列表中的项。
		比如，在下面这个数据模型中， <code class="inline-code">animals</code> 和
        <code class="inline-code">misc.fruits</code> 就是序列：</p>

<div class="code-wrapper"><pre class="code-block code-data-model"><a name="example.qStart.dataModelWithSequences"></a>(root)
  |
  +- animals
  |   |
  |   +- (1st)
  |   |   |
  |   |   +- name = &quot;mouse&quot;
  |   |   |
  |   |   +- size = &quot;small&quot;
  |   |   |
  |   |   +- price = 50
  |   |
  |   +- (2nd)
  |   |   |
  |   |   +- name = &quot;elephant&quot;
  |   |   |
  |   |   +- size = &quot;large&quot;
  |   |   |
  |   |   +- price = 5000
  |   |
  |   +- (3rd)
  |       |
  |       +- name = &quot;python&quot;
  |       |
  |       +- size = &quot;medium&quot;
  |       |
  |       +- price = 4999
  |
  +- misc
      |
      +- fruits
          |
          +- (1st) = &quot;orange&quot;
          |
          +- (2nd) = &quot;banana&quot;</pre></div><p>要访问序列的子变量，可以使用方括号形式的数字索引下标。
		索引下标从0开始(从0开始也是程序员的传统)，那么第一项的索引就是0，
		第二项的索引就是1等等。要得到第一个动物的名称的话，可以这么来写代码 
		<code class="inline-code">animals[0].name</code>。要得到 <code class="inline-code">misc.fruits</code> 
		中的第二项(字符串<code class="inline-code">&quot;banana&quot;</code>)可以这么来写 
		<code class="inline-code">misc.fruits[1]</code>。(实践中，通常按顺序遍历序列，而不用关心索引，
		这点会在 <a href="dgui_quickstart_template.html#topic.tutorial.list">后续介绍</a>。)</p><p>标量类型可以分为如下的类别：</p><ul>
          <li>
            <p>字符串：就是文本，也就是任意的字符序列，比如上面提到的
			&#39;&#39;m&#39;&#39;, &#39;&#39;o&#39;&#39;, &#39;&#39;u&#39;&#39;, &#39;&#39;s&#39;&#39;, &#39;&#39;e&#39;&#39;。比如 <code class="inline-code">name</code> 
			和 <code class="inline-code">size</code> 也是字符串。</p>
          </li>

          <li>
            <p>数字：这是数值类型，就像上面的 <code class="inline-code">price</code>。
			在FreeMarker中，字符串 <code class="inline-code">&quot;50&quot;</code> 和数字 
			<code class="inline-code">50</code> 是两种完全不同的东西。前者是两个字符的序列
			(这恰好是人们可以读的一个数字)，而后者则是可以在数学运算中直接被使用的数值。</p>
          </li>

          <li>
            <p>日期/时间: 可以是日期-时间格式(存储某一天的日期和时间)，
			或者是日期(只有日期，没有时间)，或者是时间(只有时间，没有日期)。</p>
          </li>

          <li>
            <p>布尔值：对应着对/错(是/否，开/关等值)类似的值。
			比如动物可以有一个 <code class="inline-code">protected</code> (受保护的，译者注) 的子变量，
			该变量存储这个动物是否被保护起来的值。</p>
          </li>
        </ul><p>总结：</p><ul>
          <li>
            <p>数据模型可以被看成是树形结构。</p>
          </li>

          <li>
            <p>标量用于存储单一的值。这种类型的值可以是字符串，数字，日期/时间或者是布尔值。</p>
          </li>

          <li>
            <p>哈希表是一种存储变量及其相关且有唯一标识名称的容器。</p>
          </li>

          <li>
            <p>序列是存储有序变量的容器。存储的变量可以通过数字索引来检索，索引通常从0开始。</p>
          </li>
        </ul>  <div class="callout note">
    <strong class="callout-label">Note:</strong>

          <p>还有一些其它更为高级的类型，在这里我们并没有涉及到，比如方法和指令。</p>
          </div>
<div class="bottom-pagers-wrapper"><div class="pagers bottom"><a class="paging-arrow previous" href="dgui_quickstart_basics.html"><span>Previous</span></a><a class="paging-arrow next" href="dgui_quickstart_template.html"><span>Next</span></a></div></div></div></div>      </div>
    </div>
<div class="site-footer"><div class="site-width"><div class="footer-top"><div class="col-left sitemap"><div class="column"><h3 class="column-header">Overview</h3><ul><li><a href="http://freemarker.org/index.html">What is FreeMarker?</a></li><li><a href="http://freemarker.org/freemarkerdownload.html">Download</a></li><li><a href="app_versions.html">Version history</a></li><li><a href="http://freemarker.org/history.html">About us</a></li><li><a itemprop="license" href="app_license.html">License</a></li></ul></div><div class="column"><h3 class="column-header">Handy stuff</h3><ul><li><a href="http://freemarker-online.kenshoo.com/">Try template online</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions cheatsheet</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_builtins_alphaidx.html">?built_ins</a></li><li><a href="ref_specvar.html">.special_vars</a></li></ul></div><div class="column"><h3 class="column-header">Community</h3><ul><li><a href="https://github.com/nanlei/freemarker/tree/manual-zh-2.3-gae/src/manual">Chinese Manual on Github</a></li><li><a href="https://github.com/freemarker/freemarker">FreeMarker on Github</a></li><li><a href="https://twitter.com/freemarker">Follow us on Twitter</a></li><li><a href="https://sourceforge.net/p/freemarker/bugs/new/">Report a bug</a></li><li><a href="http://stackoverflow.com/questions/ask?tags=freemarker">Ask a question</a></li><li><a href="http://freemarker.org/mailing-lists.html">Mailing lists</a></li></ul></div></div><div class="col-right"><ul class="social-icons"><li><a class="github" href="https://github.com/freemarker/freemarker">Github</a></li><li><a class="twitter" href="https://twitter.com/freemarker">Twitter</a></li><li><a class="stack-overflow" href="http://stackoverflow.com/questions/ask?tags=freemarker">Stack Overflow</a></li></ul><a class="xxe" href="http://www.xmlmind.com/xmleditor/" rel="nofollow" title="Edited with XMLMind XML Editor"><span>Edited with XMLMind XML Editor</span></a></div></div><div class="footer-bottom"><p><span class="generated-for-product">Generated for: Freemarker 2.3.23</span><span class="last-updated"> Last generated:
<time itemprop="dateModified" datetime="2015-09-18T14:38:51Z" title="Friday, September 18, 2015 2:38:51 PM GMT">2015-09-18 14:38:51 GMT</time></span></p> <p class="copyright">
© <span itemprop="copyrightYear">1999</span>–2015
<a itemtype="http://schema.org/Organization" itemprop="copyrightHolder" href="http://freemarker.org">The FreeMarker Project</a>. All rights reserved. </p>
</div></div></div></body>
</html>
